﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using DNBSoft.MSN.ClientController;

namespace WPFMessenger
{
    public partial class ConversationWindow : Window
    {
        #region Konstruktør
        //Vi skal bruge et switchboard samt en controller
        private MSNSwitchboard switchboard = null;
        private MSNController controller = null;

        //en liste over brugere i samtalen
        private List<String> chattingUsers = new List<string>();

        //Strengen indeholdene samtalen
        private String conversation = "";

        //Når klassen skal refreshes
        private delegate void RefreshDelegate();

        public ConversationWindow(MSNController controller, MSNSwitchboard switchboard)
        {
            InitializeComponent();
            
            //Vinduet skabes og switchboard samt controller modtages fra parent
            this.switchboard = switchboard;
            this.controller = controller;

            //Events. Beskeder modtaget/sendt samt bruger der forbinder/smutter
            switchboard.MessageRecieved += new MSNEventDelegates.MessageRecieved(switchboard_MessageRecieved);
            switchboard.MessageSent += new MSNEventDelegates.MessageSent(switchboard_MessageSent);
            switchboard.UserConnected += new MSNEventDelegates.SwitchboardUserConnected(switchboard_UserConnected);
        }
        #endregion
        #region Modtag/Send besked
        //En bruger er forbundet til vores samtale
        private void switchboard_UserConnected(string username, bool chatting)
        {
            //Der startes en tråd til dette for at undgå det hænger imens.
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new RefreshDelegate(delegate()
            {
                //Når brugeren er i samtalen
                if (chatting)
                {
                    //Sidste tjek for at kontrollere at brugeren faktisk er i samtalen (eller flere)
                    if (chattingUsers.Count > 0)
                    {
                        //Vi skriver brugeren er forbundet ud i chatboksen
                        conversation += username + " connected\r\n";
                        tbChat.Text = conversation;
                    }
                    //Brugeren tilføjes til listen over de brugere der er i samtalen.
                    chattingUsers.Add(username);
                    //titlen på vinduet opdates til at afspejle brugere man taler.
                    this.Title += " - " + username;
                }
                else
                {
                    //Hvis der ikke er flere tilbage i samtalen 
                    if (chattingUsers.Count < 1)
                    {
                        //Sidst talt med er derfor disconnected
                        conversation += username + " disconnected\r\n";
                        //Samtalen opdateres
                        tbChat.Text = conversation;
                    }
                    //Han fjernes fra listen over deltagere
                    chattingUsers.Remove(username);

                    this.Title.Replace(" - " + username, "");
                }

            }));
        }

        //Vi sender en besked
        private void switchboard_MessageSent(MSNUserMessage message)
        {
            //Vi gør modparten opmærksom på vi trykker på tasterne
            if (message.getMessageType() == MSNEnumerations.UserMessageType.outgoing_text_message)
            {
                //Der startes en tråd til skrivningen
                this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new RefreshDelegate(delegate()
                {
                    //Samtale strengen konkadineres med vores navn og besked
                    conversation += controller.FriendlyName + " says: "
                                + message.getUserPayload() + "\r\n";
                    //Tekst boksen til chat opdateres med samtalen
                    tbChat.Text = conversation;

                }));
            }
        }

        //Der modtages en besked (eller at nogen er ved at skrive!)
        private void switchboard_MessageRecieved(MSNUserMessage message)
        {
            //Nogen er ved at skrive til dig
            if (message.getMessageType() == MSNEnumerations.UserMessageType.incomming_text_message)
            {
                //Der startes en ny tråd til beskeden
                this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new RefreshDelegate(delegate()
                {
                    //Strengen til samtalen konkadineres med kontaktens rigtige navn samt den besked han sender. 
                    conversation += controller.ContactsList.Contacts[message.getUsername()].FriendlyName + " says: " + message.getUserPayload() + "\r\n";
                    
                    //Strengen hældes over i tekst boksen til samtalen.
                    tbChat.Text = conversation;
                }));
            }
        }

        private void sendButton_Click(object sender, RoutedEventArgs e)
        {
            //Vi sender beskeden. Kræver en font og en besked til personen.
            switchboard.sendMessage(new MSNUserOutgoingMessage("Times New Roman", tbNewMessage.Text));
            tbNewMessage.Text = "";
        }
        #endregion
    }
}